草庐IT

Java Swingworker 和多线程

全部标签

c++ - 取消卡在 epoll_wait 上的线程

我正在使用C++和pthreads进行一些事件处理。我有一个从我定义的事件队列中读取的主线程,以及一个填充事件队列的工作线程。队列当然是线程安全的。工作线程有一个文件描述符列表,并创建一个epoll系统调用来获取这些文件描述符上的事件。它使用epoll_wait等待fd上的事件。现在是问题。假设我想干净地终止我的应用程序,我怎样才能正确地取消工作线程?epoll_wait不是pthread(7)的取消点之一因此它无法对pthread_cancel做出正确react。工作线程main()看起来像这样while(m_WorkerRunning){epoll_wait(m_EpollDesc

c++ - 线程连接问题

我正在阅读一些manuals关于线程,我想到它们显示的代码不安全:std::cout我相信这段代码不是绝对安全的。如果我没记错的话,当控件到达标记为#1和的行时,无法保证helper1和helper2已经处于可连接状态>#2。此时线程可能仍未启动并且没有ID。这将导致从std::thread::join()中抛出未捕获的异常我认为下面的代码解决了这个问题。我说得对吗?std::cout 最佳答案 Astd::thread是joinable如果它包含一个尚未join的线程状态编辑或detatch编辑。Astd::thread通过非默认

c++ - 避免单线程死锁

我有以下问题:我有一个类需要防止来自不同线程的同时访问。该类有两个方法:lock()和unlock()使用(g_mutex_lock/g_mutex_unlock和每个对象GMutex)。现在锁定方法如下所示:voidObject::method(){lock();//dostuffmodifyingtheobjectunlock();}现在假设我有两个这种类型的方法,method1()和method2(),我一个接一个地调用它们:object.method1();//butwhatifsomeotherthreadmodifiesobjectinbetweenobject.metho

c++ - 如果线程在调用 pthread_join 之前退出怎么办

我有一个小代码void*PrintHello(void*threadid){cout我会在创建后的某个时间加入线程。如果main试图加入一个已经退出的线程,会发生什么? 最佳答案 Whatwillhappenifthemaintriestojoinathreadwhichalreadyexited?连接操作将立即完成并返回。 关于c++-如果线程在调用pthread_join之前退出怎么办,我们在StackOverflow上找到一个类似的问题: https:/

c++ - 当我运行多个与 CPU 核心/线程数相匹配的线程时,每个线程会在单独的核心/线程上运行吗?

线程由std::async(func)启动。如果不行,我该怎么做? 最佳答案 该标准不保证您的线程将在哪些内核/超线程上运行。这取决于操作系统。如果您想获得平台特定(不可移植),那么有各种API来控制线程亲和性-例如(例如)pthread_setaffinity_np在Linux上。但我个人建议将其留给操作系统-它很可能会做得很好,除非您有非常的特定需求。 关于c++-当我运行多个与CPU核心/线程数相匹配的线程时,每个线程会在单独的核心/线程上运行吗?,我们在StackOverflow

c++ - 为什么多线程代码在更快的机器上运行得更慢?

考虑以下C++代码:#include"threadpool.hpp"#include#include#include#includeintloop_size;voidprocess(intnum){doublex=0;doublesum=0;for(inti=0;iths;if(th_count==0){for(inti=0;ienqueue(std::bind(&process,i));}deletepool;}intdiff=std::chrono::duration_cast(std::chrono::steady_clock::now()-then).count();std::

c++ - 我可以通过使用多线程更快地分配内存吗?

如果我创建一个保留1kb整数数组int[1024]的循环,并且我希望它分配10000个数组,我可以通过从多个线程运行内存分配来使其更快吗?我希望它们在堆中。假设我有一个多核处理器来完成这项工作。我已经试过了,但是它降低了性能。我只是想知道,我是不是编写了错误的代码,还是我对内存分配一无所知?答案是否取决于操作系统?如果可以,请告诉我它在不同平台上的工作原理。编辑:整数数组分配循环只是一个简化的例子。不要费心告诉我如何改进它。 最佳答案 这取决于很多事情,但主要是:操作系统你正在使用的malloc的实现操作系统负责分配您的进程可以访问

c++ - 现在的 C 和 C++ 编译器的线程保证是什么?

我想知道编译器做出什么保证来确保对内存的线程写入在其他线程中具有可见的效果。我知道有无数个案例存在这个问题,我敢肯定,如果您有兴趣回答这个问题,您也知道,但请关注我将要介绍的案例。更准确地说,我担心会导致线程丢失其他线程完成的内存更新的情况。我不在乎(在这一点上)更新是非原子的还是同步不良:只要相关线程注意到更改,我就会很高兴。我希望编译器能够区分两种变量访问:访问必须有地址的变量;访问不一定有地址的变量。例如,如果您采用此代码段:voidsleepingbeauty(){inti=1;while(i)sleep(1);}因为i是本地的,我假设我的编译器可以优化它,让睡美人永远沉睡。v

Linux线程安全

Linux线程安全Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex互斥量的接口可重入VS线程安全常见锁概念死锁的四个必要条件Linux线程同步条件变量Linux线程互斥进程线程间的互斥相关背景概念临界资源和临界区进程之间如果要进行通信我们需要先创建第三方资源,让不同的进程看到同一份资源,由于这份第三方资源可以由操作系统中的不同模块提供,于是进程间通信的方式有很多种。进程间通信中的第三方资源就叫做临界资源,访问第三方资源的代码就叫做临界区。而多线程的大部分资源都是共享的,线程之间进行通信不需要费那么大的劲去创建第三方资源。例如,我们只需要在全局区定义一个count变量,让新线程每隔

c++ - 在同一线程上 boost 互斥锁

我是boost库的新手,这是一个非常棒的库!另外,我是互斥量的新手,如果我犯了新手错误,请原谅我。无论如何,我有两个函数,分别是FunctionOne和FunctionTwo。FunctionOne和FunctionTwo由不同的线程异步调用。下面是发生的情况:在FunctionOne中,我在函数开始时锁定了一个全局互斥锁,并在函数结束时解锁了全局互斥锁。FunctionTwo也是如此。现在问题来了:有时FunctionOne和FunctionTwo被调用的时间相隔不到几毫秒(尽管并非总是如此)。因此,FunctionOne开始执行,而FunctionTwo执行到一半。当Functio